Назад | Начало урока | Вперед
Содержание

Глава 02 (продолжение 1)

Вверх

Поиск лексемы и вставка строки

Программа построчно считывает из текстового файла, затем в строке ищет подстроку (лексему). Найдя лексему, программа вставляет перед каждой найденной лексемой новую строку. И разыскиваемая лексема и новая строка для вставки переданы программным способом (заданы программно до компиляции).

Программа 02_01


// Example_02_01 Поиск лексемы и вставка строки
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

void fun1(string str, string str1, string tmp, ofstream &to1) {

string s1;
int n = 0;

while(1 != tmp.empty() ) {

s1 = tmp;

n = tmp.find(str); // найдем позицию вхождения

if(n==-1) {

to1<< tmp <<endl;
break;
}

if(n>=0) {

s1.erase(n, tmp.length() ); //правее n все отсекаем
tmp.erase(0, n ); //левее n все отсекаем

to1<< s1 ;
to1<< str1 ;
to1<< str ;

tmp.erase(0, str.length() );

if( 1==tmp.empty()) {

to1 << "";
to1 << endl;
}
continue;
} //end if

}//end while
}


int main( int argc,char* argv[]) {


string str = "Алексей Васильевич";
string str1 = " Уважаемый ";
string tmp;
string s1;

char fileTo[100] ="fileTo.txt";
char fileFrom[100] ="fileFrom1.txt";

ifstream from1("fileFrom.txt");//открываем файл для считывания
if(!from1) {

cout<<"Vhodnoi fail ne naiden:" ;
return (1);
}

ofstream to1("fileTo.txt");//открываем файл для записи
if(!to1) {

cout<<"Vyhodnoi fail ne otkryt:" ;
return (1);
}

while (!from1.eof()) {

getline(from1,tmp,'\n');//считываем построчно в массив buf

fun1(str, str1, tmp, to1) ;

} //end while


to1.close();
from1.close();

return 0;

}


Анализ:

Основную работу в этой программе выполняет функция fun1().

Функция имеет 4 параметра

void fun1(string str, string str1, string tmp, ofstream &to1) {

Параметр str - это подстрока (лексема), которую надо отыскать в строке.
Параметр str1 - это новая строка, которую надо вставить в исходную строку.
Параметр to1 - файловый поток, в который будет передана результирующая строка.
Параметр tmp - исходная строка, которую надо обработать.

Объявим локальные переменные:

string s1;
int n = 0;

Возьмем в работу переданную исходную строку tmp. В цикле while, пока строка не пустая найдем в ней позицию вхождения разыскиваемой лексемы, которая передана в параметре str.

while(1 != tmp.empty() ) {

s1 = tmp;

n = tmp.find(str); // найдем позицию вхождения

Если в исходной строке разыскиваемой лексемы нет(функция find() возвращает -1), то копируем исходную строку без изменений в выходной файл.

if(n==-1) {

to1<< tmp <<endl;
break;
}

Если лексема в строке найдена.

if(n>=0) {

s1.erase(n, tmp.length() ); //правее n все отсекаем
tmp.erase(0, n ); //левее n все отсекаем

to1<< s1 ; // строка до лексемы
to1<< str1; // новая строка
to1<< str ; // лексема

tmp.erase(0, str.length() ); //удалим лексему

Если лексем в строке больше нет, завершим строку

if( 1==tmp.empty()) {
to1 << "";
to1 << endl;
}
continue;
} //end if

}//end while
}

Назад | Начало урока | Вперед
Содержание

Hosted by uCoz